package com.yantong.service;

import com.yantong.pojo.*;
import com.yantong.pojo.vo.*;
import com.yantong.utils.PageUtils;
import org.apache.ibatis.annotations.Param;


import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 订单服务
 *
 * @author kanghaixin
 * @date 2018/9/8.20:09
 */
public interface OrderService {

	/**
	 * 订单列表
	 *
	 * @param params
	 * @param offset
	 * @param limit
	 * @return
	 */
	PageUtils<Order> listOrders(ListOrderParams params, int offset, int limit);


	/**
	 * 订单列表 不分页
	 *
	 * @param params
	 * @return
	 */
	List<Order> listOrders(ListOrderParams params);

	/**
	 * 得到发起人拼团订单
	 *
	 * @param vo
	 * @return
	 */
	List<SpellGroupOrdVo> getSpellGroupOrdById(Long id);


	/**
	 * 得到拼团商品订单
	 *
	 * @param vo
	 * @return
	 */
	List<SpellGroupOrdVo> getSpellGroupOrd(SpellGroupOrdVo vo);
	/**
	 * 查询用户是否参与过拼团
	 *
	 * @param vo
	 * @return
	 */
	List<Order> getSpellGroupOrdByMid(SpellGroupOrdVo vo);


	/**
	 * 得到拼团内订单的用户头像昵称
	 *
	 * @param vo
	 * @return
	 */
	List<SpellGroupOrdVo> getGroupOrdHead(OrderProductDetailVo vo);


	/**
	 * 订单详情
	 *
	 * @param orderId
	 * @return
	 */
	Order getByKey(Long orderId);

	//优惠劵即将到期订阅消息
	void sendTicketOverTime(Long centreId, Long mid, Map<String, String> map);

	//优惠劵即将到期公众号文本消息
	void sendGZHTicketOverTime(Long centreId, Long mid, Map<String, String> map, String url);

	void sendAccountsTemplateToUser(Long centreId, Long mid, Map<String, String> map);

	/**
	 * 查询订单数据条数
	 *
	 * @param order
	 * @return
	 */
	Integer countByOrder(Order order);


	/**
	 * 条件查询订单商品列表
	 *
	 * @param params
	 * @param rowBounds
	 * @return
	 */
	PageUtils<OrderProductDetailVo> ordProductlistByParams(OrderProductDetailVo params, int offset, int limit);


	/**
	 * 得到平台商品的总成本，总利益
	 *
	 * @param params
	 * @return
	 */
	OrderProductDetailVo getBaseProductMoneyTotal(OrderProductDetailVo params);

	/**
	 * 条件查询平台订单商品列表
	 *
	 * @param params
	 * @param rowBounds
	 * @return
	 */
	PageUtils<OrderProductDetailVo> ordProductBaselistByParams(OrderProductDetailVo params, int offset, int limit);

	/**
	 * 后台订单关闭
	 *
	 * @param orderId
	 * @param closeIp
	 * @param desc
	 * @return
	 */
	int closeOrder(Long orderId, String closeIp, String desc);


	/**
	 * 后台确认发货
	 *
	 * @param orderId
	 * @return
	 */
	int sendGoods(Long orderId);

	/**
	 * 关闭订单下的所有订单商品
	 *
	 * @param orderId 订单ID
	 * @return
	 */
	int closeOrderProduct(Long orderId);


	/**
	 * 后台确认收货
	 *
	 * @param orderId
	 * @return
	 */
	int confirmReceived(Long orderId);

	/**
	 * 后台订单申请退款
	 *
	 * @param orderId
	 * @param aid
	 * @param aname
	 * @return
	 */
	int refundOrder(Long orderId, Long aid, String aname);


    /**
     * ，用户主动取消订单
     *
     * @param orderId 订单ID
     * @return
     */
    int cancelOrder(Long orderId, Integer flag);

	/**
	 * 更新订单基本信息
	 *
	 * @param order
	 * @return
	 */
	int update(Order order);

	/**
	 * 条件查询平台订单商品列表导出没有分页
	 *
	 * @param params
	 * @param rowBounds
	 * @return
	 */
	List<OrderProductDetailVo> ordProductBaselistByParamsExp(OrderProductDetailVo params);



	PageUtils<JuheOrder> juheOrdersList(Long mid,Long teamId, Long centerId, String params, Integer paystatus, Integer payType, Date startTime, Date endTime, int offset, int limit);


	/**
	 * 根据订单id得到商品订单list
	 *
	 * @param orderid
	 * @return
	 */
	List<OrderProduct> getOrderProductListByOrdId(Long orderid);


	/**
	 * 完成订单
	 *
	 * @param order
	 * @return
	 */
	int completeOrder(Order order);


	/**
	 * 门店统计
	 *
	 * @param shopCountParams timeType: 0-今日，3-昨日，4-按时间
	 * @param offset
	 * @param limit
	 * @return
	 */
	Map<String, Object> shopCount(ShopCountParams shopCountParams, int offset, int limit);


	/**
	 * 订单详情
	 *
	 * @param orderId
	 * @return
	 */
	Order getByKeyAndProductId(Long orderId, Long id);

	Order getByPayNo(String payNo);


	/**
	 * 售后订单条件查询订单列表
	 *
	 * @param params
	 * @return
	 */
	PageUtils<WorkListVo> workOrderlistByParams(ListOrderParams params, int offset, int limit);

	BuyProjectVo calcProjectExpCharge(Member member, Integer serviceDays, ProjectExp projectExp);


	BigDecimal calcTicketAmount(Long trId, BigDecimal orderPrice, Long centreId,List<ProductCentre> list,Integer cateringType,Map<String,String> skuMap,BigDecimal postage);


	/**
	 * 创建订单
	 *
	 * @param req
	 * @return
	 */
	String submitOrder1(OrderReq req) throws ParseException;


	//商品购买通用公众号模板消息
	void sendGZHProductGeneralMsg(Long centreId, Long mid, Map<String, String> map, String url);

    /**
     * 开团订阅消息
     *
     * @param order          订单信息
     * @param marketingGroup 拼团商品信息
     * @author liaozhaogui
     * @date 2020/12/2 15:39
     */
    void sendTeamBegin(Order order, MarketingGroup marketingGroup);


    /**
     * 成团订阅消息.公众号
     * @author TaoHao
     * @date 2021/3/9 15:39
     */
    void sendGZHTeamSucceed(Long centreId, Long mid, Map<String, String> map, String url);

    /**
     * 等待成团订阅消息
     *
     * @param order          订单信息
     * @param marketingGroup 拼团商品信息
     * @author liaozhaogui
     * @date 2020/12/2 15:39
     */
    void sendTeamAwait(Order order, MarketingGroup marketingGroup, int count);


    //退款公众号模板消息
    void sendGZHRefund(Long centreId, Long mid, Map<String, String> map, String url);

	//拼团失败公众号模板消息
	void sendGZHTeamFailed(Long centreId, Long mid, Map<String, String> map, String url);

	int updOrderPayAttach(Map<String, Object> updMap);

	void updateOpenid(Order order1);

	/**
	 * 获取用户下各状态的订单数量
	 *
	 * @param mid
	 * @return
	 */
	List<Map<String, Object>> getStatusCounts(Long mid);


	/**
	 * 获取用户下各状态的订单数量
	 *
	 * @param mid
	 * @return
	 */
	List<Map<String, Object>> getCanyinOrderCounts(Long mid);


	/**
	 * 参团人数
	 *
	 * @param sgorderId
	 * @return
	 */
	int getSpellGroupOrdCount(Long sgorderId);


	/**
	 * 营销中心创建订单
	 *
	 * @param req
	 * @return
	 */
	String submitOrderMarketing(MarketingBuyReq req) throws ParseException;

	Long getWaitOrderId(ListOrderParams params);


	/**
	 * 得到订单最新的用户头像
	 *
	 * @param productId
	 * @param offset
	 * @param limit
	 * @return
	 */
	PageUtils<OrderHead> getOrderUserHeadImg(Long productId, int offset, int limit);

	/**
	 * 供应商售后商品列表
	 *
	 * @param params
	 * @param offset
	 * @param limit
	 * @return
	 */
	PageUtils<AfterSaleProductVo> listAfterSaleProductList(ListAfterProductParams params, Integer offset,
														   Integer limit);
	/**
	 * 供应商销量统计
	 *
	 * @param shopCountParams
	 * @param offset
	 * @param limit
	 * @return
	 */
	Map<String, Object> supplyCount(ShopCountParams shopCountParams, int offset, int limit);



	/**
	 * 商户订单号获取订单信息
	 *
	 * @param tradNo
	 * @return
	 */
	Order getOrderByTradNo(String tradNo);

	//开通会员公众号模板消息
	void sendGZHOpenMembership(Long centreId, Long mid, Map<String, String> map, String url);

	JuheOrder getJuheOrderByOutTradeNo(String outTradeNo);

	/**
	 * 通过outtradeno 查询支付订单
	 *
	 * @param outTradeNo
	 * @return
	 */
	List<Order> getOrderByOutTradeNo(String outTradeNo);

	BigDecimal calcTicketAmountJuhepay(Long trId,BigDecimal orderPrice,Long centreId);

	JuheOrder createJuheOrder(Long mid,Long centerId, Long teamId, String userId, String payAmount, String code, Integer wxPay,BigDecimal payPrice,Long trId);

	/**
	 * 得到跑p任务拼团中订单
	 *
	 * @return
	 */
	List<OrderProductDetailVo> getTaskSpellGroupOrd();

	void autoCompleteOrder(List<OrderProduct> ops, Long centerId, Double exchange);

	List<OrderProduct> listSuccessOrderProductsTime(Date dateStartTime, Date parseDate, Long centreId);

	/**
	 * 获取指定状态下的订单商品
	 *
	 * @param orderId
	 * @param status
	 * @return
	 */
	List<OrderProduct> listOrderProducts(Long orderId, Integer status, Integer isKuaidi);

	/**
	 * 获取收货时间距离当前时间超过7天的订单，用以结算佣金和积分
	 *
	 * @param sevenDate
	 * @param start
	 * @param centreId
	 * @param offset
	 * @param limit
	 * @return
	 */
	List<Order> listSuccessOrders(Date sevenDate, Date start, Long centreId, int offset, int limit);


	/**
	 * 创建订单
	 *
	 * @param req
	 * @return
	 */
	String submitActivtyOrder(OrderReq req) throws ParseException;

	/**
	 * 获取最新的门店申请订单
	 */
	Order getTeamOrder(@Param("mid")Long mid);
}

